iTesting软件测试知识分享

[web开发] Flask+Python开发个人博客(三)

Blue print 蓝图应用指南

今天我们来讲讲flask里的blue print – 蓝图。
旧文两篇:
[web开发] Flask+Python开发个人博客(一)
[Web开发] Flask+Python 开发个人博客(二)

在前两篇的时候,大家还记得不同类型的账户,访问到的同一个页面元素有不同吗?这个是怎么做到呢?这就是蓝图的妙用了。
什么是蓝图,我们为什么要用蓝图?我们来看下exploreflask上的解释:

What is a blueprint?
一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。举个例子,想象一下我们有一个用于管理面板的蓝图。这个蓝图将定义像/admin/login和/admin/dashboard这样的路由的视图。它可能还包括所需的模板和静态文件。你可以把这个蓝图当做你的应用的管理面板,管它是宇航员的交友网站,还是火箭推销员的CRM系统。

Why would you use blueprints?
蓝图的杀手锏是将你的应用组织成不同的组件。假如我们有一个微博客,我们可能需要有一个蓝图用于网站页面,比如index.html和about.html。然后我们还需要一个用于在登录面板中展示最新消息的蓝图,以及另外一个用于管理员面板的蓝图。站点中每一个独立的区域也可以在代码上隔绝开来。最终你将能够把你的应用依据许多能完成单一任务的小应用组织起来。

Where do you put them?

以我的blog为例,对于同一篇文章,我希望不同权限的人看到的内容不同,但是我又想最大程度的重用一个模板,我的目录应该如下面的类似组织:

How to use:

  1. 前提条件,forms需要定义好, forum_app/forms.py

    1
    2
    3
    4
    5
    6
    7
    8
    from flask_wtf import FlaskForm
    from wtforms import StringField, SubmitField, validators,
    from wtforms.validators import Regexp
    class PostEditor(FlaskForm):
    title = StringField('标题', [validators.DataRequired("Please enter your title")])
    category = StringField('类别')
    publish = SubmitField('发布')
  2. 在views里定义好路由

以admin_views为例:

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#coding=utf-8
import time
from flask import render_template,request, Blueprint, redirect, url_for
from forum_app.db_helper.db_helper import update_post
from forum_app.forms import PostEditor
blue_admin = Blueprint('blue_admin', __name__, template_folder='admin_forums')
@blue_admin.route('/detail_posts', methods =['GET', 'POST'])
def posts_detail():
form = PostEditor()
pid = request.args.get("id")
post_title = request.args.get("title")
post_category = request.args.get("category")
post_author = request.args.get("author")
post_contents = request.args.get("contents")
post_create_time = request.args.get("create_time")
blue_print_name = "blue_admin"
form.category.data = request.args.get("category")
form.title.data = request.args.get("title")
if request.method == "POST" and form.validate_on_submit():
if request.form.get('publish') == '发布':
update_post(request.form.get('title'), request.form.get('category'), request.form.get('editor1'), id=pid)
return redirect(url_for('forum'))
return render_template('admin_forums/posts.html', post_title=post_title,\
post_category=post_category, \
post_author=post_author, post_contents=post_contents, \
blue_print_name=blue_print_name, post_create_time=post_create_time, pid=pid, form=form)

创建一个蓝图的语法如下:

1
blue_admin = Blueprint('blue_admin', __name__, template_folder='admin_forums')

To create a blueprint object, we import the Blueprint() class and initialize it with the arguments name and import_name. Usually import_name will just be name, which is a special Python variable containing the name of the current module.
The last parameter tell flask that the blueprint has its own template and static direcories.

  1. 定义好蓝图后,要把它注册到我们的程序上:
    run.py

    1
    2
    3
    4
    5
    6
    7
    from flask import Flask
    from forum_app.views.admin_views.views import blue_admin
    app = Flask(__name__)
    app.register_blueprint(blue_admin, url_prefix='/admin')
    app.run(debug=True)
  2. 最后一步,构造URL,绑定路由和HTML template。
    你只需要在 URL 的末端加上蓝图的名称和一个点( . )作为前缀即可完成绑定:
    url_for(‘blue_admin.post_detail’)
    templates/forum.html 部分代码

本例中我为了方便,user的post_detail路由和admin的post_detail路由所指向的html template我分开了:

两个posts.html,在应用中你也可以用一个template,中间用if语句引导不同的路由渲染不同的templates。

到此就完成了所有blue print的应用,blueprint 给我们提供了一种类插件功能,我们可以利用它完成很多功能,比如admin用户的control panel功能,这样方便了我们定制功能。

更多内容,查看官方文文档: http://docs.jinkan.org/docs/flask/blueprints.html

🐶 您的支持将鼓励我继续创作 🐶
-------------评论, 吐槽, 学习交流,请关注微信公众号 iTesting-------------
请关注微信公众号 iTesting wechat
扫码关注,跟作者互动